package gcp.testes;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import gcp.Amigo;
import gcp.Filme;
import gcp.Gibi;
import gcp.Jogo;
import gcp.Usuario;
import gcp.enums.ClassificacaoEtaria;
import gcp.enums.GeneroFilme;
import gcp.enums.GibiEstado;
import gcp.enums.ItemEstado;
import gcp.enums.Sexo;
import gcp.enums.TipoDeJogo;
import gcp.principal.GCP;

import org.junit.Before;
import org.junit.Test;


/**
 * Classe de testes de GCP.
 * @author catharine
 * 
 */
public class GCPTeste {
    private GCP gcp;
    private Usuario usuario;
    private Amigo amigo;
    private Filme filme;
    private Gibi gibi;
    private Jogo jogo;

    /**
     * Inicializacao das variaveis para o teste.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Before
    public void setUp() throws Exception {
        gcp = new GCP();
        usuario = new Usuario("Catharine", "Quintans", Sexo.FEMININO, "catha",
                "12345");
        amigo = new Amigo("Natasha", "Bezerra", Sexo.SELECIONAR);
        filme = new Filme("Inglourious Bastards", "Universal Pictures", 2009,
                ClassificacaoEtaria.DEZOITO, ItemEstado.FALTANDO, GeneroFilme.GUERRA, null);
        gibi = new Gibi("Batman", "DC", 2009, ClassificacaoEtaria.DOZE, ItemEstado.FALTANDO,
                GibiEstado.CONSERVADO, null);
        jogo = new Jogo("The Beatles: Rock Band", "MTV Games", 2009, ClassificacaoEtaria.DOZE,
                TipoDeJogo.INDEFINIDO, ItemEstado.FALTANDO, null);

        gcp.adicionaUsuario(usuario);
        gcp.adicionaItens(usuario, filme);
        gcp.adicionaItens(usuario, gibi);
        gcp.adicionaItens(usuario, jogo);
        gcp.adicionaAmigo(usuario, amigo);
    }

    /**
     * Testa adicionar um usuario com nome nulo.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaAdicionaUsuarioComNomeNulo() throws Exception {
        gcp.adicionaUsuario(new Usuario(null, "Quintans", Sexo.FEMININO,
                "catha", "12345"));
    }

    /**
     * Testa adicionar um usuario com sobrenome nulo.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaAdicionaUsuarioComSobrenomeNulo() throws Exception {
        gcp.adicionaUsuario(new Usuario("Catharine", null, Sexo.FEMININO,
                "catha", "12345"));
    }

    /**
     * Testa adicionar um usuario com login nulo.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaAdicionaUsuarioComLoginNull() throws Exception {
        gcp.adicionaUsuario(new Usuario("", "Quintans", Sexo.FEMININO, null,
                "12345"));
    }

    /**
     * Testa adicionar um usuario com senha nula.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaAdicionaUsuarioComSenhaNula() throws Exception {
        gcp.adicionaUsuario(new Usuario("", "Quintans", Sexo.FEMININO, "catha",
                null));
    }

    /**
     * Testa adicionar um usuario com nome vazio.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaAdicionaUsuarioComNomeVazio() throws Exception {
        gcp.adicionaUsuario(new Usuario("", "Quintans", Sexo.FEMININO, "catha",
                "12345"));
    }

    /**
     * Testa adicionar um usuario com sobrenome vazio.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaAdicionaUsuarioComSobrenomeVazio() throws Exception {
        gcp.adicionaUsuario(new Usuario("Catharine", "", Sexo.FEMININO,
                "catha", "12345"));
    }

    /**
     * Testa adicionar um usuario com login vazio.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaAdicionaUsuarioComLoginVazio() throws Exception {
        gcp.adicionaUsuario(new Usuario("", "Quintans", Sexo.FEMININO, "",
                "12345"));
    }

    /**
     * Testa adicionar um usuario com senha vazia.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaAdicionaUsuarioComSenhaVazia() throws Exception {
        gcp.adicionaUsuario(new Usuario("", "Quintans", Sexo.FEMININO, "catha",
                ""));
    }

    /**
     * Testa remover um usuario inexistente.
     * @throws Exception Lancada quando algum parametro for invalido ou caso o
     *             usuario nao exista.
     */
   @Test(expected = Exception.class)
    public void testaRemoverUsuarioInexistente() throws Exception {
        gcp.removeUsuario(new Usuario("Natasha", "Bezerra", Sexo.FEMININO,
                "nath", "54321"));
    }

    /**
     * Testa remover um usuario existente.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaRemoverUsuarioExistente() throws Exception {
        gcp.removeUsuario(usuario);
    }

    /**
     * Testa remover um filme existente.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaRemoverFilmeExistente() throws Exception {
        gcp.remover(usuario, filme);
    }

    /**
     * Testa remover um jogo existente.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaRemoverJogoExistente() throws Exception {
        gcp.remover(usuario, jogo);
    }

    /**
     * Testa remover um gibi existente.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaRemoverGibiExistente() throws Exception {
        gcp.remover(usuario, gibi);
    }

    /**
     * Testa remover um amigo innexistente.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaRemoverAmigoInexistente() throws Exception {
        gcp.removeAmigo(usuario, new Amigo("Ana", "da Silva", Sexo.SELECIONAR));
    }

    /**
     * Testa remover um amigo existente.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaRemoverAmigoExistente() throws Exception {
        gcp.removeAmigo(usuario, amigo);
    }

    /**
     * Testa o metodo getUsuario de GCP.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaGetUsuario() throws Exception {
        assertEquals(usuario, gcp.getUsuario(usuario.getLogin()));
    }

    /**
     * Testa o metodo getAmigo de GCP.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaGetAmigo() throws Exception {
        assertEquals(amigo, gcp.getAmigo(usuario, amigo.getNome(), amigo
                .getSobrenome()));
    }

    /**
     * Testa o metodo getList para verificar a existencia do gibi.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaGetGibi() throws Exception {
        assertTrue(gcp.getList(usuario).contains(gibi));
    }

    /**
     * Testa o metodo getList para verificar a existencia do filme.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaGetFilme() throws Exception {
        assertTrue(gcp.getList(usuario).contains(filme));
    }

    /**
     * Testa o metodo getList para verificar a existencia do jogo.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaGetJogo() throws Exception {
        assertTrue(gcp.getList(usuario).contains(jogo));
    }

    /**
     * Testa o metodo getListUsuario de GCP.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaGetListUsuario() throws Exception {
        assertTrue(gcp.getListUsuario().contains(usuario));
    }

    /**
     * Testa o metodo getListAmigo de GCP.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaGetListAmigo() throws Exception {
        assertTrue(gcp.getListAmigo(usuario).contains(amigo));
    }
}